# 带着二哈去旅行丶:ZZQ
# 生成时间：2021/7/27 15.4 使用Plotly模拟掷骰子.3 随机漫步数:32
print('1------------------函数的创建与调用')

'''
def calc(a, b):  # 函数创建 a,b称为形式参数，形参在定义处
    c = a + b
    return c


result = calc(10, 20)  # 函数调用  10,20称为实际参数，实参在调用处
print(result)
res = calc(b=10, a=20)  # 关键字参数
print(res)
'''
print('\n2--------------------函数的参数传递')
'''
def fun(a1,a2):
    print('a1=',a1)
    print('a2=',a2)
    a1=100
    a2.append(10)
    print('a1=', a1)
    print('a2=', a2)
# 在函数调用过程中，进行参数的传递
n1=11
n2=[22,33,44]
print(n1)
print(n2)
fun(n1,n2)      # a1,a2形参，n1,n2实参
print(n1)       # 如果是不可变对象，在函数体的修改不会影响实参的值，a1的修改为100，不会影响n1的值
print(n2)       # 如果是可变对象，在函数体的修改会影响到实参的值，a1的修改，append(10),会影响到n2
'''
print('\n3-------------------函数的返回值')
'''
def fun(num):
    odd=[]      # 存放奇数
    even=[]     # 存放偶数
    for i in num:
        if i%2:
            odd.append(i)
        else:
            even.append(i)
    return odd,even
lst=[10,29,34,23,44,53,55]
print(fun(lst))
# （1）如果函数没有返回值【函数执行完毕后，不需要给调用处提供数据】return可以省略不谢
# （2）函数返回值，如果是1个，直接返回类型
# （3）函数返回值，如果是多个，返回结果为元组
# 函数在定义时，是否需要返回值，视情况而定
'''
print('\n4---------------------函数参数的定义')
'''
# 个数可变的位置参数（*）：在无法事先确定传递的位置实参个数时，使用可变位置参数，返回结果是一个元组
def fun(*a):
    print(a)
fun(10)
fun(10,30)
fun(10,20,30)       # 返回元组
# 个数可变的关键字形参（**）：返回结果是一个字典
def fun1(**a):
    print(a)
fun1(a=10)
fun1(a=10,b=20,c=30)  # 返回字典
# 个数可变的位置参数和关键字参数只能是1个
# 两个都有时，要求个数可变的位置形参，放在个数可变的关键字形参之前
'''
print('\n5--------------------函数的递归')
'''
def fac(n):
    if n==1:           # 递归出口
        return 1
    else:
        res=n*fac(n-1)  # 调用函数，执行递归
        return res
print(fac(6))
'''
print('\n6------------------斐波那契数列')
'''
def fib(n):
    if n==1:
        return 1
    if n==2:
        return 1
    else:
        return fib(n-1)+fib(n-2)
# f斐波那契数列第6位数字
print(fib(6))
# 输出这个数列的前6位
for i in range(1,7):
    print(fib(i))
'''